package main

import (
	"fmt"
	"io"
	"os"
)

type myStruct struct {
	myOut io.Writer
	count int64
}

func (m *myStruct) Write(p []byte) (int, error) {
	// 使结构体 myStruct 实现 Write 接口
	// 使用封装的 Write 获得写入字节数，然后将这个 int 类型的字节数转换为 int64 类型
	n, err := m.myOut.Write(p)
	m.count = int64(n)
	return n, err
}

func CountingWriter(w io.Writer) (io.Writer, *int64) {
	ms := &myStruct{myOut: w} // 创建新的结构体，该结构体封装了传入的 Writer 接口类型，同时也实现了 Writer 接口
	return ms, &ms.count
}

func main() {
	myOut, count := CountingWriter(os.Stdout) // 将标准输出封装了一下，返回封装后的自定义输出
	fmt.Fprintln(myOut, "Hello world")
	fmt.Println(*count)
}

// 参考：https://github.com/rockyr8/gopl-topics/blob/master/7%E6%8E%A5%E5%8F%A3/ex2.go
